package implementacion;

import tda.ConjuntoIntTDA;
import tda.ConjuntoItemsFacturaTDA;
import tda.FacturacionTDA;
import tda.ItemFactura;
//el diccionario multiple
public class FacturacionD implements FacturacionTDA {

	class nodoF
	{
		int clave;
		conjuntoFacturaD items;
		nodoF sig;
	}
		
	nodoF referencia;
	int cantidad;
	
	public void inicializar() {
		
		referencia = null;
		cantidad = 0;
	}

	@Override
	public void agregar(int nroFactura, ItemFactura item) {
		
		nodoF aux = referencia;

		boolean existeK = false;
		
		while(aux != null && !existeK) 
		{
			if(aux.clave == nroFactura)
			{
				existeK= true; 
			
			}
			else
				aux = aux.sig;
		}
		if(!existeK) 
		{
			nodoF nuevo = new nodoF();
			nuevo.items = new conjuntoFacturaD();
			nuevo.items.inicializarConjunto();
			nuevo.clave = nroFactura;			
			nuevo.items.agregar(item);
			nuevo.sig = referencia;
			referencia = nuevo;			
			cantidad++;
			
		}
		else 
			{
				aux.items.agregar(item);
			}
		
	}

	@Override
	public void eliminarFactura(int nroFactura) {
		
		nodoF aux = referencia;
		nodoF ant = referencia;
		
		if (referencia != null)
		{
			if(referencia.clave == nroFactura)
			{
				referencia = referencia.sig;			
			}
			else
			{
				while(aux != null)
				{			
					if(aux.clave == nroFactura)
					{
						ant.sig = aux.sig;
						cantidad--;
						break;
					}
					ant = aux;
					aux = aux.sig;
				}
			}
		}
	}

	@Override
	public void eliminarArticulo(int nroFactura, int codArticulo) {
		/*
		 * dada una clave y un valor se elimina el valor asociado a la
			clave, y en caso de que la clave o el valor no existan no se hace nada. Si al
			eliminar el valor, la clave no tiene otros valores asociados se debe eliminar
			la misma. Se supone que el diccionario esta inicializado.
		 * */
		nodoF aux = referencia;
		nodoF ant = referencia;
		ItemFactura itemAux = new ItemFactura();
		itemAux.codigo = codArticulo;
		boolean existeFactura = false;
		if (referencia != null)
		{
			if (referencia.clave == nroFactura)
			{
				referencia.items.sacar(itemAux);
				if(referencia.items.conjuntoVacio())
				{
					referencia = referencia.sig;
					cantidad--;
				}
			}
			else
			{	
				while(aux != null && !existeFactura) 
				{
					if(aux.clave == nroFactura)
					{
						existeFactura = true; 
					
					}
					else{
						ant = aux;
						aux = aux.sig;
					}
				}
				if(existeFactura)
				{
					aux.items.sacar(itemAux);
					
					if(aux.items.conjuntoVacio())
					{
						ant.sig = aux.sig;
						cantidad--;
					}
				}

			}
		}
	}

	@Override
	public ConjuntoIntTDA facturas() {
	
		nodoF aux = referencia;
		ConjuntoIntTDA conjunto = new ConjuntoIntLD();
		conjunto.inicializarConjunto();
		while(aux != null){
			conjunto.agregar(aux.clave);
			aux = aux.sig;
		}
		return conjunto;
	}

	@Override
	public ConjuntoItemsFacturaTDA recuperarArticulos(int nroFactura) {
	
		nodoF aux = referencia;
		ConjuntoItemsFacturaTDA conjunto = new conjuntoFacturaD();
		conjunto.inicializarConjunto();
		boolean ok=false;
		while(aux!=null && !ok)
		{
			if (aux.clave == nroFactura){
				ok = true;
			}
			else
				aux = aux.sig;
		}
		if(ok)
		{
			conjunto =  aux.items;
		}
		return conjunto;
	}



}
